/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
// 我感觉这个的实现比较简单，而且效果还不错
var search = function (nums, target) {
  return nums.indexOf(target);
};

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
/* 
为了在旋转排序数组中高效地搜索目标值，可以使用二分查找的变体。
关键在于利用数组的有序部分来确定目标值可能存在的区间。

方法思路
二分查找初始化：设置左右指针分别指向数组的首尾。
判断有序部分：每次计算中间索引后，判断左半部分或右半部分是否有序。
确定搜索区间：
如果左半部分有序，检查目标值是否在左半部分的范围内，若是则收缩右指针，否则收缩左指针。
如果右半部分有序，检查目标值是否在右半部分的范围内，若是则收缩左指针，否则收缩右指针。
终止条件：找到目标值或搜索区间为空时结束。
*/
var search = function (nums, target) {
  let left = 0;
  let right = nums.length - 1;

  while (left <= right) {
    const mid = Math.floor((left + right) / 2);

    if (nums[mid] === target) {
      return mid;
    }

    // 判断左半部分是否有序
    if (nums[left] <= nums[mid]) {
      // 目标值在左半部分的有序区间内
      if (target >= nums[left] && target < nums[mid]) {
        right = mid - 1;
      } else {
        left = mid + 1;
      }
    }
    // 右半部分有序
    else {
      // 目标值在右半部分的有序区间内
      if (target > nums[mid] && target <= nums[right]) {
        left = mid + 1;
      } else {
        right = mid - 1;
      }
    }
  }

  return -1;
};